package com.zlsy.thread.threadpool;


import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author zhouliang
 * @date 2020/7/1 23:24
 * <p>
 * WorkStealingPool：工作窃取线程
 * <p>
 * 假设共有三个线程同时执行，A，B，C
 * 当A，B线程池尚未处理任务结束，而C已经处理完毕，则C线程会从A或则B中去窃取任务执行，这就叫做工作窃取
 * 假如A线程中的队列分配了5个任务，而B线程的队列中分配了一个任务，当B线程执行完成后，它会主动的去A的线程
 * 中窃取其他的任务进行执行。
 * <p>
 * 【WorkStealingPool的背后是使用的ForkJoinPool实现的】
 */
public class NewWorkStealingPoolTest {
    public static void main(String[] args) {
        //cpu核数
        int cpuNums = Runtime.getRuntime().availableProcessors();

        ExecutorService executorService = Executors.newWorkStealingPool();

        for (int i = 0; i < cpuNums + 1; i++) {
            //4核 + 1
            executorService.execute(new R(2000));
        }

        // 因为work stealing 是deamon线程,即后台线程,精灵线程,守护线程
        // 所以当main方法结束时, 此方法虽然还在后台运行,但是无输出
        // 可以通过对主线程阻塞解决
        try {
            System.in.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        executorService.shutdown();
    }

    static class R implements Runnable {

        int time;

        R(int time) {
            this.time = time;
        }

        @Override
        public void run() {
            try {
                TimeUnit.MILLISECONDS.sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "  " + time);
        }
    }
}
